/* stack.c */

#include "stack.h"

/**
 *	Function	: stack_create
 *	Param In	: 无
 *	Param Out	: 无
 *	Return Val	: 返回栈底指针
 *	Dscription	: 初始化一个栈
 *	Date		: 2016/Apr/29  01:27:32 PM
 */
Stack *stack_create(){
	Stack *stack = (Stack *)malloc(sizeof(Stack));
	stack->data = (type_t *)malloc(sizeof(type_t) * MAXSIZE);
	memset(stack->data, 0, sizeof(type_t) * MAXSIZE);
	stack->index = 0;
	return stack;
}

/**
 *	Function	: stack_destroy
 *	Param In	: stack: 要销毁栈的栈底指针
 *	Param Out	: 无
 *	Return Val	: 无
 *	Dscription	: 销毁一个栈
 *	Date		: 2016/Apr/29  01:27:41 PM
 */
void stack_destory(Stack *stack){
	stack->index = 0;
	free(stack);
	return;
} 

/**
 *	Function	: push
 *	Param In	: stack: 栈底指针
 *				  data: 入栈的数据
 *	Param Out	: 无
 *	Return Val	: 成功返回OK，失败返回ERROR
 *	Dscription	: 入栈操作
 *	Date		: 2016/Apr/29  01:27:55 PM
 */
int push(Stack *stack, type_t data){
	if(stack->index == MAXSIZE)
		return ERROR;
	else{
		stack->data[stack->index] = data;
		stack->index++;
		return OK;
	}
}

/**
 *	Function	: pop
 *	Param In	: stack: 栈底指针
 *	Param Out	: pData: 出栈的数据保存位置
 *	Return Val	: 成功返回OK，失败返回ERROR
 *	Dscription	: 出栈操作
 *	Date		: 2016/Apr/29  01:30:17 PM
 */
int pop(Stack *stack, type_t *pData){
	if(stack->index == 0)
			return ERROR;
	else{
		*pData = stack->data[stack->index - 1];
		stack->index--;
		return OK;
	}

}

/**
 *	Function	: getHead
 *	Param In	: stack: 栈底指针
 *	Param Out	: 无
 *	Return Val	: 栈顶数据
 *	Dscription	: 获取栈顶数据
 *	Date		: 2016/Apr/29  01:32:03 PM
 */
type_t getHead(Stack *stack){
	type_t res;
	if(stack != NULL){
		res = stack->data[stack->index - 1];
	}
	return res;
}

/**
 *	Function	: pop_null
 *	Param In	: stack: 栈底指针
 *	Param Out	: 无
 *	Return Val	: 无
 *	Dscription	: 进行一个出栈操作，但不保存数据
 *	Date		: 2016/Apr/29  01:33:08 PM
 */
void pop_null(Stack *stack){
	if(stack != NULL)
		stack->index--;
}

/**
 *	Function	: stack_size
 *	Param In	: stack: 栈底指针
 *	Param Out	: 无
 *	Return Val	: 返回栈的大小
 *	Dscription	: 返回一个栈当前的大小
 *	Date		: 2016/Apr/29  01:36:19 PM
 */
int stack_size(Stack *stack){
	return stack->index;
}
